Skill

DI এর মাধ্যমে Tight Coupling এর সমস্যা সমাধান

Dependency Injection এর বেসিক কনসেপ্ট - গুইস (Guice) - Java Technologies

233

Dependency Injection (DI) এমন একটি নকশা প্যাটার্ন যা একটি শ্রেণির (class) উপর নির্ভরশীলতা (dependencies) সরাসরি ম্যানুয়ালি তৈরি না করে বাহ্যিক উৎস থেকে সরবরাহ করা হয়। Guice-এর মতো DI ফ্রেমওয়ার্ক ব্যবহার করে tight coupling সমস্যাগুলি সমাধান করা সম্ভব হয়।


Tight Coupling কী?

  • Tight Coupling হল এমন একটি পরিস্থিতি যেখানে একাধিক শ্রেণি (classes) পরস্পরের উপর দৃঢ়ভাবে নির্ভরশীল।
  • এর ফলে:
    • শ্রেণিগুলির পুনঃব্যবহারযোগ্যতা (reusability) হ্রাস পায়।
    • পরীক্ষণ (testing) কঠিন হয়ে যায়।
    • কোড মডিফাই করলে একটি শ্রেণির পরিবর্তন অন্য শ্রেণিতেও পরিবর্তন আনতে বাধ্য করে।

উদাহরণ:

public class BillingService {
    private final PaymentService paymentService;

    public BillingService() {
        this.paymentService = new PaypalPaymentService(); // Tight coupling
    }

    public void processPayment() {
        paymentService.pay();
    }
}

class PaypalPaymentService implements PaymentService {
    public void pay() {
        System.out.println("Payment made via PayPal.");
    }
}

interface PaymentService {
    void pay();
}

সমস্যা:

  1. BillingService সরাসরি PaypalPaymentService-এর উপর নির্ভরশীল।
  2. নতুন PaymentService যুক্ত করলে BillingService পরিবর্তন করতে হবে।

Guice এবং Dependency Injection-এর সমাধান

Guice Tight Coupling সমস্যার সমাধান করে Constructor Injection, Field Injection, এবং Method Injection ব্যবহার করে।

1. Constructor Injection

Guice @Inject ব্যবহার করে নির্ভরশীলতা ইনজেক্ট করতে সাহায্য করে।

import com.google.inject.Inject;

public class BillingService {
    private final PaymentService paymentService;

    @Inject
    public BillingService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void processPayment() {
        paymentService.pay();
    }
}

2. Guice মডিউল এবং Binding

Guice AbstractModule ব্যবহার করে নির্ভরশীলতার রেজিস্ট্রেশন পরিচালনা করে।

import com.google.inject.AbstractModule;

public class BillingModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(PaymentService.class).to(PaypalPaymentService.class);
    }
}

3. Main Method: Guice Injector

Guice-এর মাধ্যমে Injector ব্যবহার করে BillingService তৈরি করুন।

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new BillingModule());
        BillingService billingService = injector.getInstance(BillingService.class);
        billingService.processPayment();
    }
}

Guice-এর মাধ্যমে Tight Coupling সমাধান

  1. Interfaces ব্যবহার:
    • Guice নির্ভরশীলতাকে Interface দ্বারা নির্ধারণ করে, যা Implementation-এর উপর নির্ভরশীলতা কমায়।
  2. Binding Decoupling:
    • BillingService ক্লাস সরাসরি নির্দিষ্ট PaymentService-এর উপর নির্ভর করে না।
    • Guice মডিউল নির্ধারণ করে কোন PaymentService ব্যবহার হবে।
  3. পরিবর্তন এবং পরীক্ষণ সহজ:
    • নতুন PaymentService যোগ করা হলে শুধু মডিউলে bind পরিবর্তন করতে হবে।
    • Unit Testing-এ মক বা স্টাব (Mock/Stub) ব্যবহার করা সহজ।

Tight Coupling-এর উদাহরণ থেকে Loose Coupling-এ পরিবর্তন

Tight Coupling (Before Guice):

public class BillingService {
    private final PaymentService paymentService;

    public BillingService() {
        this.paymentService = new PaypalPaymentService(); // Tight Coupling
    }

    public void processPayment() {
        paymentService.pay();
    }
}

Loose Coupling (After Guice):

public class BillingService {
    private final PaymentService paymentService;

    @Inject
    public BillingService(PaymentService paymentService) {
        this.paymentService = paymentService; // Decoupled
    }

    public void processPayment() {
        paymentService.pay();
    }
}

Guice vs Traditional DI Approaches

বৈশিষ্ট্যTraditional ApproachGuice Approach
CouplingTight CouplingLoose Coupling
Configurationম্যানুয়াল ফ্যাক্টরি বা কনস্ট্রাক্টর ব্যবহৃত হয়Annotation এবং মডিউল ব্যবহার
FlexibilityImplementation পরিবর্তন করা কঠিনBinding পরিবর্তন করেই নতুন Implementation যুক্ত
TestabilityDependency Mocking কঠিনসহজে Mock বা Stub তৈরি করা সম্ভব
Runtime BindingনেইBinding runtime-এ নির্ধারণ করা যায়

  • Guice DI Framework Tight Coupling সমস্যার কার্যকর সমাধান করে, যা ক্লাসগুলিকে আরো modular, flexible, এবং testable করে তোলে।
  • Guice এর মাধ্যমে Constructor Injection ব্যবহার করলে শ্রেণিগুলির মধ্যে সরাসরি নির্ভরশীলতা দূর হয়।
  • Guice শুধুমাত্র ছোট প্রজেক্ট নয়, বড় এবং জটিল প্রজেক্টেও কার্যকর যেখানে নির্ভরশীলতার সংখ্যা বেশি।
  • Loose Coupling-এর জন্য Guice সহজ, লাইটওয়েট এবং কার্যকর সমাধান।
Content added By
Promotion

Are you sure to start over?

Loading...